home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / PET / O-Old PET 1979 / (o)a2.d64 / sc1.s i_o fix < prev    next >
Text File  |  2007-04-22  |  19KB  |  702 lines

  1. ;**************************************
  2. ;*                                    *
  3. ;*     FIXED SCREEN INPUT ROUTINE     *
  4. ;*        BY PAUL HIGGINBOTTOM        *
  5. ;*   (COMMODORE SOFTWARE DEPARTMENT)  *
  6. ;*                                    *
  7. ;**************************************
  8. ;
  9. ;USES '<' AS OPENING DELIMITER,
  10. ;AND  '>' AS CLOSING DELIMITER
  11. ;OF A FIELD.
  12. ;
  13. ;LABELS USED:-
  14. ;
  15. GET =$FFE4 ;DOES A 'GET'
  16. POINTR =1 ;GENERAL POINTER LO=1,HI=2
  17. ERRFLG =0 ;ERROR FLAG / GENERAL FLAG
  18. OPENDL =60 ;PEEK CODE OF '<' SYMBOL
  19. CLSEDL =62 ;PEEK CODE OF '>' SYMBOL
  20. CRSRLO =196 ;- START ADDRESS OF LINE
  21. CRSRHI =197 ;  WHICH CURSOR IS ON
  22. CRSRPN =198 ;CURSOR POSITION (0-LINLEN)
  23. CRSRLN =216 ;CURRENT LINE CURSOR IS ON.
  24. ARRTAB =$2C ;POINTER TO START OF VAR.
  25. ARREND =$2E ;POINTER TO END OF VAR.
  26. ARRPTR =$23 ;POINTER TO ARRAY
  27. STRPTR =$25 ;POINTER TO DATA FROM ARRAY
  28. NUMINS =220 ;NUMBER OF INSERTS LEFT
  29. QTEFLG =205 ;QUOTE FLAG
  30. PIA =155 ;PIA KEYSWITCH FOR RUNSTOP/RVS
  31. ;
  32. ;ILLEGAL OR CONTROL KEYS :-
  33. ;
  34. HME =19 ;HOME CURSOR
  35. CLR =147 ;CLR SCREEN & HOME CURSOR
  36. RVS =18 ;REVERSE FIELD ON
  37. OFFRVS =146 ;REVERSE FIELD OFF
  38. CU =145 ;CURSOR UP
  39. CD =17 ;CURSOR DOWN
  40. CR =29 ;CURSOR RIGHT
  41. CL =157 ;CURSOR LEFT
  42. RTN =13 ;RETURN
  43. DEL =20 ;DELETE
  44. INS =148 ;INSERT
  45. ESC =27 ;ESCAPE
  46. TAB =9 ;TAB CHARACTER
  47. SHFRTN =141 ;SHIFTED RETURN
  48. SHFTAB =137 ;SHIFTED TAB
  49. SHFESC =155 ;SHIFTED ESCAPE
  50. RUNSTP =3 ;RUN/STOP
  51. ;
  52. ;REQUIRES THAT:-
  53. ;EACH FIELD ON THE SCREEN HAS:-
  54. ; A '<' AT THE START AND.....
  55. ; A '>' AT THE END OF EACH FIELD
  56. ;
  57. ;**************************************
  58. ;* MAIN ENTRY POINT. RESETS POINTERS, *
  59. ;* THEN SCANS FOR A FIELD. IF ONE IS  *
  60. ;* FOUND, THEN THE CODE GOES ON, ELSE *
  61. ;* SCREEN ACCEPT MODE IS ENTERED.     *
  62. ;**************************************
  63. ;
  64. BEGIN JSR RESET ;SET POINTERS TO START
  65. MAIN JSR UNFLSH ;UNHIGHLIGHT CURSOR
  66.  JSR SCANFD ;SCAN FOR A FIELD
  67.  BCC OK ;FOUND ONE - GO ON
  68. ;
  69. ACCEPT JSR UNFLSH ;UNHILIGHT CURRENT POSITION
  70.  LDA #<ACCMSG ;DO SCREEN ACCEPT
  71.  LDY #>ACCMSG ;SET A,Y TO MESSAGE
  72.  JSR PRTSTR ;AND PRINT IT
  73. KYLOOP JSR GET ;DO A 'GET'
  74.  BEQ KYLOOP ;NOTHING PRESSED - GO BACK
  75. KY CMP #SHFRTN ;IS IT A SHIFTED RETURN ?
  76.  BNE KY0 ;NO - GO ON
  77.  JMP GETSTR ;YES - GO ON TO READ SCREEN
  78. KY0 CMP #HME ;HOME ?
  79.  BNE KY1 ;NO - GO ON
  80.  JSR ERASE ;ERASE MESSAGE
  81.  JMP BEGIN ;GO DO IT
  82. KY1 CMP #CU ;CURSOR UP ?
  83.  BNE KY2 ;NO - GO ON
  84.  LDA #1 ;SET FLAG FOR ONE SCAN ONLY
  85.  STA ERRFLG ;
  86.  JSR ERASE ;ERASE MESSAGE
  87.  JSR BD1 ;SCAN BACK TO BOTTOM FIELD
  88.  BCS ACCEPT ;IF NOT FOUND - GO BACK
  89.  JMP OK ;AND CARRY ON
  90. KY2 CMP #CLR ;CLEAR SCREEN ?
  91.  BNE KY3 ;NO - GO ON
  92.  JSR ERASE ;ERASE MESSAGE
  93.  LDA #CLR ;RESET CLR CHAR
  94.  JMP OK4 ;GO DO IT
  95. KY3 CMP #RUNSTP ;RUN/STOP ?
  96.  BNE KYLOOP ;NO - GO BACK
  97.  LDA #2 ;SET ERROR FLAG TO 2
  98.  STA ERRFLG
  99.  LDA #$FF ;NULLIFY RUNSTOP FLAG
  100.  STA PIA
  101.  JMP FINISH ;AND RETURN TO BASIC
  102. ;
  103. ;**************************************
  104. ;* ROUTINE TO CLEAR THE BOTTOM LINE   *
  105. ;**************************************
  106. ;
  107. ERASE LDA #<ERSMSG ;ERASE SCREEN ACCEPT
  108.  LDY #>ERSMSG ;SET A,Y TO STRING
  109.  JSR PRTSTR ;AND PRINT IT
  110.  RTS
  111. ;
  112. ;**************************************
  113. ;* MAIN LOGIC TO HANDLE ALL KEYBOARD  *
  114. ;* ENTRIES.                           *
  115. ;**************************************
  116. ;
  117. OK JSR FDCRSR ;OK - MOVE TO NEXT POSITION
  118.  JSR HILGHT ;HILIGHT NEW CRSR POSITION
  119. INPUT JSR GET ;GET A CHARACTER
  120.  BEQ INPUT ;NOTHING PRESSED - TRY AGAIN
  121.  CMP #CD ;CURSOR DOWN ?
  122.  BEQ NXTFLD ;YES - GO ONTO NEXT FIELD
  123.  CMP #RTN ;OR A RETURN ?
  124.  BNE OK1 ;NO - GO ON
  125. NXTFLD JMP MAIN ;YES - GO ON SCANNING
  126. OK1 CMP #HME ;HOME ?
  127.  BNE KYTEST ;NO - GO ON
  128.  JSR UNFLSH ;UNHILIGHT PRESENT POSITION
  129.  JMP BEGIN ;YES - START AT FIRST FIELD
  130. KYTEST LDX #0 ;ZEROISE TABLE INDEX
  131. TEST CMP NOGOOD,X ;ANY GOOD ?
  132.  BEQ INPUT ;NO - GO BACK
  133.  INX ;BUMP TABLE INDEX
  134.  LDY NOGOOD,X ;END OF TABLE ?
  135.  CPY #0
  136.  BNE TEST ;NO - CARRY ON
  137. OK2 CMP #SHFRTN ;SHIFTED RETURN ?
  138.  BNE OK3 ;NO - GO ON
  139.  JMP ACCEPT ;YES - GOTO SCREEN ACCEPT
  140. OK3 CMP #CU ;CURSOR UP ?
  141.  BNE OK4 ;NO - GO ON
  142.  JSR SAVREG ;YES - SAVE CURSOR POSITION
  143.  JSR UNFLSH ;UNHILIGHT CURSOR POSITION
  144.  JSR SCANBD ;SCAN BACK TO PREVIOUS FIELD
  145.  BCS TOPSCR ;ALREADY IN THE TOP FIELD!
  146.  JMP OK ;FINE - CARRY ON INPUTTING
  147. TOPSCR JSR RESREG ;RESET CURSOR POSITION
  148.  JSR HILGHT ;RE-HILIGHT CURSOR POSITION
  149.  JMP INPUT
  150. OK4 CMP #CLR ;CLEAR SCREEN ?
  151.  BNE OK5 ;NO - GO ON
  152.  LDA #1 ;YES - SET ERRFLG
  153.  STA ERRFLG ;
  154.  JMP FINISH ;AND RETURN TO BASIC
  155. OK5 CMP #CL ;CURSOR LEFT ?
  156.  BEQ OK6 ;YES - GO ON
  157.  CMP #DEL ;DELETE ?
  158.  BNE OK7 ;NO - GO ON
  159. OK6 PHA ;SAVE CHARACTER
  160.  JSR DECPTR ;LOOK AT LEFT SIDE
  161.  LDY #0 ;ZEROISE OFFSET
  162.  LDA (POINTR),Y ;GET CHARACTER
  163.  CMP #OPENDL ;IS IT AN OPEN DELIMITER ?
  164.  BEQ RETURN ;YES - GO ON
  165.  JSR INCPTR ;RESET POINTER
  166.  PLA ;NO - RETRIEVE CHARACTER
  167.  CMP #DEL ;WAS IT A DELETE ?
  168.  BNE CRSRLF ;NO - GO ON
  169.  JMP DELETE ;YES - GO TO IT
  170. CRSRLF JSR PRTCHR ;NO - PRINT IT
  171.  JMP INPUT ;AND GO BACK
  172. RETURN PLA ;FIX STACK
  173.  JSR INCPTR ;RESET POINTER
  174.  JMP INPUT ;YES - GO BACK
  175. OK7 CMP #INS ;INSERT ?
  176.  BNE OK8 ;NO - GO ON
  177.  JMP INSERT ;GO TO IT
  178. OK8 CMP #RUNSTP ;RUN/STOP ?
  179.  BNE OK9 ;NO - GO ON
  180.  JSR UNFLSH ;YES - UNHILIGHT CURSOR POSITION
  181.  LDA #2 ;SET ERROR FLAG TO 2
  182.  STA ERRFLG
  183.  JMP FINISH ;AND RETURN TO BASIC
  184. OK9 PHA ;SAVE CHARACTER
  185. OK10 JSR SAVREG ;SAVE CURSOR POSITION
  186.  JSR INCPTR ;MOVE TO RIGHT HAND SIDE
  187.  LDY #0 ;ZEROISE OFFSET
  188.  LDA (POINTR),Y ;GET CHARACTER
  189.  CMP #CLSEDL ;IS IT A CLOSE DELIMITER ?
  190.  BEQ NOPRT ;YES - TAKE CARE OF IT
  191.  JSR DECPTR ;NO - RESET OLD CRSR POSITION
  192.  PLA ;RE-GET CHARCTER
  193.  JSR PRTCHR ;PRINT IT PROPERLY !
  194.  JMP INPUT ;AND CARRY ON
  195. ;
  196. NOPRT JSR DECPTR ;RESET POINTER
  197.  JSR UNFLSH ;UNHILIGHT CURSOR POSITION
  198.  JSR SAVREG ;SAVE REGISTERS
  199.  PLA ;CLEAN UP STACK
  200.  JSR PRINT ;PRINT IT
  201.  JSR ESCAPE ;DO AN ESCAPE
  202.  JSR RESREG ;RESET REGISTERS BACK ONTO
  203.  JSR HILGHT ;THE SAME SQUARE AND HILGHT
  204.  JMP INPUT ;IT AND CARRY ON
  205. ;
  206. ;**************************************
  207. ;* ROUTINE TO SET POINTER AND  CURSOR *
  208. ;* TO THE HOME POSITION.              *
  209. ;**************************************
  210. ;
  211. RESET LDA #<SCREEN ;GET LO BYTE OF SCREEN ADDRESS
  212.  STA POINTR
  213.  LDA #>SCREEN
  214.  STA POINTR+1
  215.  LDA #HME ;LOAD A 'HOME'
  216.  JSR PRINT ;AND PRINT IT
  217.  LDA #CD ;LOAD A 'CURSOR DOWN'
  218.  JSR PRINT ;AND PRINT IT
  219.  LDA #0 ;LOAD A ZERO
  220.  STA ERRFLG ;INITIALISE ERROR FLAG
  221.  RTS ;AND RETURN
  222. ;
  223. ;**************************************
  224. ;* ROUTINE TO SCAN FORWARD FROM THE   *
  225. ;* CURRENT CURSOR POSITION TO A FIELD.*
  226. ;* THE CARRY IS USED AS A FLAG STATING*
  227. ;* WHETHER OR NOT A FIELD WAS FOUND.  *
  228. ;**************************************
  229. ;
  230. SCANFD LDY #0 ;ZEROISE OFFSET
  231.  LDA (POINTR),Y ;GET A CHARACTER
  232.  CMP #OPENDL ;IS IT AN OPENING DELIMITER ?
  233.  BEQ FOUND ;YES - RETURN
  234.  JSR FDCRSR ;NO - BUMP POINTER
  235.  LDA #>ENDSCR ;GET END OF SCREEN HI
  236.  CMP POINTR+1 ;SAME AS POINTER HI ?
  237.  BNE SCANFD ;NO - KEEP ON SCANNING
  238.  LDA #<ENDSCR ;YES - GET END OF SCREEN LO
  239.  CMP POINTR ;SAME AS POINTER LO
  240.  BNE SCANFD ;NO - KEEP ON SCANNING
  241.  SEC ;YES - SET 'NOT FOUND' FLAG
  242.  RTS ;AND GO BACK
  243. FOUND CLC ;SET FOUND FLAG
  244.  RTS ;AND GO BACK
  245. ;
  246. ;**************************************
  247. ;* ROUTINE TO SCAN BACKWARDS FROM THE *
  248. ;* CURRENT CURSOR POSITION TO A FIELD.*
  249. ;* THE CARRY IS USED AS A FLAG STATING*
  250. ;* WHETHER OR NOT A FIELD WAS FOUND.  *
  251. ;**************************************
  252. ;
  253. SCANBD LDA #0 ;GET A ZERO
  254.  STA ERRFLG ;ZEROISE FLAG
  255. BD1 LDY #0 ;ZEROISE OFFSET
  256.  LDA (POINTR),Y ;GET A CHARACTER
  257.  CMP #OPENDL ;IS IT AN OPENING DELIMITER ?
  258.  BEQ FOUND1 ;YES - FOUND FIELD - GO ON
  259. BD2 JSR BKCRSR ;NO - BUMP POINTER & CURSOR
  260.  LDA #>SCREEN ;GET START OF SCREEN HI
  261.  CMP POINTR+1 ;SAME AS POINTER HI ?
  262.  BNE BD1 ;NO - KEEP ON SCANNING
  263.  LDA #<SCREEN ;YES - GET START OF SCREEN LO
  264.  CMP POINTR ;SAME AS POINTER LO
  265.  BNE BD1 ;NO KEEP ON SCANNING
  266.  SEC ;YES - SET 'NOT FOUND' FLAG
  267.  RTS ;AND GO BACK
  268. FOUND1 DEC ERRFLG ;DECREMENT FLAG
  269.  BEQ FOUND2 ;OK - WE'VE DONE IT
  270.  INC ERRFLG ;BUMP IT TO ZERO
  271.  INC ERRFLG ;THEN TO ONE
  272.  JMP BD2 ;GO DO IT A SECOND TIME
  273. FOUND2 CLC ;SET 'FOUND FLAG'
  274.  RTS ;AND RETURN
  275. ;
  276. COUNT .BYT 0 ;GENERAL COUNTER/STORE
  277. ;
  278. ;**************************************
  279. ;* ROUTINE TO HANDLE INSERTION KEY.   *
  280. ;* MOVES ALL CHARACTERS FROM CURSOR   *
  281. ;* POSITION TO THE END OF THE FIELD   *
  282. ;* UP ONE PLACE, THUS ERASING THE LAST*
  283. ;* CHARACTER IN THE FIELD. THEN A     *
  284. ;* SPACE IS PRINTED AT THE CURRENT    *
  285. ;* CURSOR POSITION.                   *
  286. ;**************************************
  287. ;
  288. INSERT LDY #0 ;ZEROISE OFFSET
  289.  JSR INCPTR ;MOVE ONTO NEXT SQUARE
  290. INS1 LDA (POINTR),Y ;LOOK AT IT
  291.  CMP #CLSEDL ;END OF FIELD ?
  292.  BEQ INS2 ;YES - GO ON
  293.  INY ;NO - BUMP INDEX
  294.  BNE INS1 ;AND GO BACK
  295. INS2 STY COUNT ;SAVE INDEX
  296.  CPY #0 ;AT END OF FIELD ?
  297.  BNE INS3 ;IF NOT AT END - GO ON
  298.  JSR DECPTR ;RESET POINTER
  299.  JMP NOINST ;AND GO ON
  300. INS3 JSR UNFLSH
  301.  JSR DECPTR ;RESET POINTER
  302.  LDY COUNT ;RESET INDEX
  303.  INY
  304. INS4 DEY
  305.  DEY
  306.  LDA (POINTR),Y
  307.  INY
  308.  STA (POINTR),Y
  309.  CPY #1 ;FINISHED ?
  310.  BNE INS4 ;NO - GO BACK
  311.  LDY #0 ;ZEROISE OFFSET
  312. NOINST LDA #160 ;LOAD A RVS SPACE
  313.  STA (POINTR),Y ;PUT IT BACK
  314.  JMP INPUT ;CARRY ON
  315. ;
  316. ;**************************************
  317. ;* ROUTINE TO HANDLE THE DELETE KEY.  *
  318. ;* MOVES ALL CHARACTERS FROM END OF   *
  319. ;* THE FIELD BACK TO THE CURRENT      *
  320. ;* CURSOR POSITION BACK ONE PLACE AND *
  321. ;* PRINTS A SPACE IN THE LAST POSITION*
  322. ;* OF THE FIELD. DOES NOT FUNCTION IN *
  323. ;* FIRST POSITION OF FIELD.           *
  324. ;**************************************
  325. ;
  326. DELETE JSR UNFLSH ;UNHILIGHT CURSOR POSITION
  327.  JSR INCPTR ;MOVE ONTO NEXT SQUARE
  328.  LDY #0 ;ZEROISE OFFSET
  329. DEL1 LDA (POINTR),Y ;LOOK AT IT
  330.  CMP #CLSEDL ;END OF FIELD ?
  331.  BEQ DEL2 ;YES - GO ON
  332.  INY ;NO - BUMP INDEX
  333.  BNE DEL1 ;AND GO BACK
  334. DEL2 STY COUNT ;SAVE INDEX
  335.  JSR DECPTR ;RESET POINTER
  336.  JSR DECPTR ;RESET POINTER
  337.  LDY #1 ;SET OFFSET
  338. DEL3 LDA (POINTR),Y ;GET A CHARACTER
  339.  DEY
  340.  STA (POINTR),Y ;MOVE IT
  341.  CPY COUNT ;FINSHED ?
  342.  BEQ DEL4 ;YES - GO ON
  343.  INY ;BUMP IT BACK
  344.  INY ;AND ONE MORE
  345.  JMP DEL3 ;AND GO BACK
  346. DEL4 INC COUNT ;FIX OFFSET
  347.  LDY COUNT ;GET IT
  348.  LDA #32 ;LOAD A SPACE
  349.  STA (POINTR),Y ;PUT IT ON THE SCREEN
  350.  LDA #CL ;MOVE CURSOR, BACK ONE
  351.  JSR PRTCHR
  352.  JMP INPUT ;AND GO BACK
  353. ;
  354. ;**************************************
  355. ;* ROUTINE TO PRINT A STRING WHICH IS *
  356. ;* STORED AT THE ADDRESS IN THE       *
  357. ;* ACCUMULATOR AND THE Y REGISTER.    *
  358. ;* PRINTS MESSAGE ON BOTTOM LINE AT   *
  359. ;* 'MSGPN' WHICH IS DEPENDENT ON THE  *
  360. ;* SCREEN WIDTH, IN ORDER TO CENTER   *
  361. ;* THE MESSAGE.                       *
  362. ;**************************************
  363. ;
  364. PRTSTR STA POINTR ;PUT A,Y IN POINTER
  365.  STY POINTR+1
  366.  LDY #0 ;ZEROISE OFFSET
  367.  LDA #23 ;SET PRINT AT BOTTOM LINE
  368.  STA CRSRLN
  369.  LDA #RTN ;PRINT A RETURN
  370.  JSR PRINT
  371.  LDA #MSGPN ;SET COLUMN
  372.  STA CRSRPN
  373. PRLOOP LDA (POINTR),Y ;GET A CHARACTER
  374.  BEQ GOBACK ;IF NULL - END OF STRING
  375.  JSR PRINT ;PRINT THE CHARACTER
  376.  JSR INCPTR ;BUMP THE POINTER
  377.  BNE PRLOOP ;AND GO ONTO THE NEXT
  378. GOBACK JMP UPDATE ;FIX POINTER & RTS
  379. ;
  380. ;**************************************
  381. ;* ROUTINE TO INCREMENT THE 16 BIT    *
  382. ;* POINTER 'POINTR' BY ONE.           *
  383. ;**************************************
  384. ;
  385. INCPTR INC POINTR ;INCREMENT LO BYTE
  386.  BNE NOINC ;NOT ZERO - DON'T BUMP HI BYTE
  387.  INC POINTR+1 ;BUMP POINTER HI
  388. NOINC RTS
  389. ;
  390. ;**************************************
  391. ;* ROUTINE TO DECREMENT THE 16 BIT    *
  392. ;* POINTER 'POINTR' BY ONE.           *
  393. ;**************************************
  394. ;
  395. DECPTR LDA POINTR ;GET POINTER LO
  396.  BNE NODEC ;NOT ZERO - DON'T BUMP HI BYTE
  397.  DEC POINTR+1 ;DECREMENT THE HI BYTE
  398. NODEC DEC POINTR ;DECREMENT THE LO BYTE
  399.  RTS
  400. ;
  401. ;**************************************
  402. ;* ROUTINE TO INCREMENT THE 16 BIT    *
  403. ;* POINTER 'ARRPTR' BY ONE. THIS      *
  404. ;* POINTER IS USED TO FIND THE SC$    *
  405. ;* ARRAY.                             *
  406. ;**************************************
  407. ;
  408. ARRINC INC ARRPTR ;INCREMENT LO BYTE
  409.  BNE NOINC ;NOT ZERO - DON'T BUMP HI BYTE
  410.  INC ARRPTR+1 ;BUMP POINTER HI
  411.  RTS
  412. ;
  413. ;**************************************
  414. ;* ROUTINE TO SIMULATE PRINTING A     *
  415. ;* CURSOR RIGHT CHARACTER. THIS IS    *
  416. ;* USED INSTEAD OF ACTUALLY PRINTING  *
  417. ;* A CURSOR RIGHT, BECAUSE IT IS A    *
  418. ;* GREAT DEAL FASTER!                 *
  419. ;**************************************
  420. ;
  421. FDCRSR JSR INCPTR ;BUMP POINTER ON ONE
  422.  INC CRSRPN ;INCREMENT CURSOR POSITION
  423.  LDA #LINLEN ;LOAD ACCUMULATOR WITH LINELENGTH
  424.  CMP CRSRPN ;SAME AS CURSOR POSITION ?
  425.  BNE CRSROK ;NO - GO ON
  426.  CLC ;YES - ADD LINELENGTH TO CRSR LINEPTR
  427.  ADC CRSRLO ;ADD LO BYTE
  428.  STA CRSRLO ;STORE IT
  429.  LDA #0 ;GET 0
  430.  STA CRSRPN ;RESET CURSOR POSITION
  431.  ADC CRSRHI ;ADD HI BYTE + CARRY
  432.  STA CRSRHI ;STORE IT
  433.  INC CRSRLN ;BUMP CURRENT LINE
  434. CRSROK RTS ;AND GO BACK
  435. ;
  436. ;**************************************
  437. ;* ROUTINE TO SIMULATE PRINTING A     *
  438. ;* CURSOR LEFT CHARACTER. THIS IS     *
  439. ;* USED INSTEAD OF ACTUALLY PRINTING  *
  440. ;* A CURSOR LEFT AGAIN BECAUSE IT IS A*
  441. ;* GREAT DEAL FASTER!                 *
  442. ;**************************************
  443. ;
  444. BKCRSR JSR DECPTR ;BUMP POINTER DOWN ONE
  445.  DEC CRSRPN ;DECREMENT CURSOR POSITION
  446.  BPL CRSROK ;IF STILL POSITIVE THEN OK!
  447.  LDA #LINLEN-1 ;IT'S BELOW ZERO - SET IT TO LINELENGTH-1
  448.  STA CRSRPN ;
  449.  SEC ;SUBTRACT LINELENGTH FROM CRSR LINEPTR
  450.  LDA CRSRLO ;GET LO BYTE
  451.  SBC #LINLEN ;SUBTRACT LENGTH OF LINE
  452.  STA CRSRLO ;STORE RESULT
  453.  LDA CRSRHI ;GET HI BYTE
  454.  SBC #0 ;SUBTRACT 'BORROW' (IF ANY)
  455.  STA CRSRHI
  456.  DEC CRSRLN
  457.  RTS ;AND GO BACK
  458. ;
  459. ;**************************************
  460. ;* ROUTINE TO HILIGHT THE CURRENT     *
  461. ;* CURSOR POSITION.                   *
  462. ;**************************************
  463. ;
  464. HILGHT LDY CRSRPN ;LOAD OFFSET
  465.  LDA (CRSRLO),Y ;GET CHR AT CURSOR POSITION
  466.  ORA #$80 ;HILGHT IT
  467.  STA (CRSRLO),Y ;PUT CHR BACK AT POSITION
  468.  RTS
  469. ;
  470. ;**************************************
  471. ;* ROUTINE TO UN-HILIGHT THE CURRENT  *
  472. ;* CURSOR POSITION.                   *
  473. ;**************************************
  474. ;
  475. UNFLSH LDY CRSRPN ;LOAD OFFSET
  476.  LDA (CRSRLO),Y ;GET CHR AT CURSOR POSITION
  477.  AND #$7F ;PUT IT OUT OF REVERSE
  478.  STA (CRSRLO),Y ;PUT CHR BACK AT POSITION
  479.  RTS
  480. ;
  481. ;**************************************
  482. ;* ROUTINE TO OUTPUT CHARACTER TO     *
  483. ;* SCREEN. THE JSR ESCAPE IS USED     *
  484. ;* RATHER THAN PRINTING AN ESCAPE     *
  485. ;* CHARACTER, BECAUSE THIS CHARACTER  *
  486. ;* IS NOT AVAILABLE ON THE 40 COLUMN  *
  487. ;* PET, AND SO THIS ROUTINE SIMULATES *
  488. ;* IT.                                *
  489. ;**************************************
  490. ;
  491. PRTCHR PHA ;SAVE CHARACTER TO BE PRINTED
  492.  JSR UNFLSH ;UN-HIGHLIGHT CURSOR POSITION
  493.  PLA ;GET CHARACTER TO PRINT
  494.  JSR PRINT ;PRINT IT
  495.  JSR ESCAPE ;DO AN ESCAPE
  496.  JSR HILGHT ;HIGHLIGHT NEW POSITION
  497. UPDATE CLC ;UPDATE POINTERS
  498.  LDA CRSRPN ;GET CURSOR POSITION
  499.  ADC CRSRLO ;ADD LO BYTE OF START OF LINE
  500.  STA POINTR ;STORE IT
  501.  LDA #0 ;ADD CARRY TO HIGH BYTE
  502.  ADC CRSRHI ;
  503.  STA POINTR+1 ;STORE IT
  504.  RTS ;AND RETURN
  505. ;
  506. ;**************************************
  507. ;* ROUTINE TO SIMILATE PRINTING AN    *
  508. ;* ESCAPE CHARACTER, AVAILABLE ON THE *
  509. ;* 80 COLUMN PET. THIS CHARACTER      *
  510. ;* NULLIFIES THE AFFECT OF EITHER     *
  511. ;* PRESSING THE INSERTION KEY, OR     *
  512. ;* WHEN INSIDE QUOTES, I.E TO STOP    *
  513. ;* CONTROL CHARACTERS BEING DISPLAYES *
  514. ;* LITERALLY.                         *
  515. ;**************************************
  516. ;
  517. ESCAPE LDA #0 ;NULLIFY QUOTE MODE
  518.  STA QTEFLG
  519.  STA NUMINS ;AND SAY - NO INSERTS
  520.  LDA #OFFRVS ;LOAD AN OFF REVERSE
  521.  JMP PRINT ;PRINT IT AND RETURN
  522. ;
  523. REGSAV .BYT 0,0,0,0,0,0 ;STORAGE AREA
  524. ;
  525. ;**************************************
  526. ;* ROUTINE TO SAVE CURRENT CURSOR     *
  527. ;* POSITION AND THE CONTENTS OF THE   *
  528. ;* POINTER 'POINTR'.                  *
  529. ;**************************************
  530. ;
  531. SAVREG LDA CRSRLO ;GET CURSOR LINE LO
  532.  STA REGSAV ;SAVE IT
  533.  LDA CRSRHI ;GET CURSOR LINE HI
  534.  STA REGSAV+1 ;SAVE IT
  535.  LDA CRSRPN ;GET CURSOR POSITION
  536.  STA REGSAV+2 ;SAVE IT
  537.  LDA CRSRLN ;GET CURRENT LINE
  538.  STA REGSAV+3 ;SAVE IT
  539.  LDA POINTR ;GET POINTER LO
  540.  STA REGSAV+4 ;SAVE IT
  541.  LDA POINTR+1 ;GET POINTER HI
  542.  STA REGSAV+5 ;SAVE IT
  543.  RTS ;AND GO BACK
  544. ;
  545. ;**************************************
  546. ;* ROUTINE TO RESET CURRENT CURSOR    *
  547. ;* POSITION AND THE POINTER 'POINTR'  *
  548. ;* TO THE SAVED VALUES.               *
  549. ;**************************************
  550. ;
  551. RESREG LDA REGSAV ;GET CURSOR LINE LO
  552.  STA CRSRLO ;RESET IT
  553.  LDA REGSAV+1 ;GET CURSOR LINE HI
  554.  STA CRSRHI ;RESET IT
  555.  LDA REGSAV+2 ;GET CURSOR POSITION
  556.  STA CRSRPN ;RESET IT
  557.  LDA REGSAV+3 ;GET CURRENT LINE
  558.  STA CRSRLN ;RESET IT
  559.  LDA REGSAV+4 ;GET POINTER LO
  560.  STA POINTR ;RESET IT
  561.  LDA REGSAV+5 ;GET POINTER HI
  562.  STA POINTR+1 ;RESET IT
  563.  RTS ;AND GO BACK
  564. ;
  565. ;**************************************
  566. ;* CODE TO FIND SC$ ARRAY AND READ    *
  567. ;* THE CONTENTS OF THE FIELDS INTO    *
  568. ;* THE ARRAY, USING THE LENGTHS OF    *
  569. ;* ARRAY ELEMENTS AS THE NUMBER OF    *
  570. ;* CHARACTERS TO BE READ FROM THE     *
  571. ;* START OF THE FIELD. IT WILL ABORT  *
  572. ;* IF THE ARRAY DOES NOT EXIST, AN    *
  573. ;* ELEMENT OF THE ARRAY IS NULL, THE  *
  574. ;* END OF THE SCREEN IS REACHED, OR   *
  575. ;* THE LAST ELEMENT OF THE ARRAY IS   *
  576. ;* DONE.                              *
  577. ;**************************************
  578. ;
  579. GETSTR LDA ARRTAB ;SET ARRPTR
  580.  STA ARRPTR ;TO FIND SC$ ARRAY
  581.  LDA ARRTAB+1
  582.  STA ARRPTR+1
  583.  JSR RESET
  584.  LDY #0 ;ZEROISE OFFSET
  585. LOOP LDA (ARRPTR),Y ;LOAD VAR1
  586.  CMP #'S ;IS IT AN 'S' ?
  587.  BNE INC7 ;NO - GO ON
  588.  JSR ARRINC ;INCREMENT ARRAY PTR
  589.  LDA (ARRPTR),Y ;LOAD VAR2
  590.  CMP #195 ;SHIFTED 'C' ?
  591.  BNE INC6 ;NO - GO ON
  592.  JMP FOUND4 ;FOUND IT - GO ON
  593. INC7 JSR ARRINC ;MOVE ON A BYTE
  594. INC6 JSR ARRINC ;AND ANOTHER
  595.  LDA (ARRPTR),Y ;GET PTRLO TO NEXT ARRAY
  596.  STA REGSAV ;SAVE IT
  597.  JSR ARRINC ;MOVE ONTO NEXT BYTE
  598.  LDA (ARRPTR),Y ;GET PTRHI TO NEXT ARRAY
  599.  STA REGSAV+1 ;SAVE IT
  600.  LDA ARRPTR ;GET LO BYTE
  601.  CLC
  602.  ADC REGSAV ;ADD OFFSET LO
  603.  STA ARRPTR ;SET ARRAY PTR LO
  604.  LDA ARRPTR+1 ;GET HI BYTE
  605.  ADC REGSAV+1 ;ADD OFFSET HI
  606.  STA ARRPTR+1 ;SET ARRAY PTR HI
  607.  SEC
  608.  LDA ARRPTR ;SUBTRACT 3
  609.  SBC #3
  610.  STA ARRPTR
  611.  LDA ARRPTR+1
  612.  SBC #0
  613.  STA ARRPTR+1
  614. ;
  615.  LDA ARRPTR+1 ;END OF ARRAYS ?
  616.  CMP ARREND+1
  617.  BCC LOOP ;NO - KEEP LOOKING
  618.  BNE EXIT ;YES - EXIT
  619.  LDA ARRPTR ;LO BYTE ?
  620.  CMP ARREND
  621.  BCC LOOP ;NO - KEEP LOOKING
  622. EXIT JMP FINISH ;AND RETURN
  623. ;
  624. FOUND4 JSR ARRINC ;MOVE ONTO LO
  625.  JSR ARRINC ;& HI OF NEXT ARRAY
  626.  JSR ARRINC ;NUM DIMENSIONS
  627.  LDA (ARRPTR),Y ;GET IT
  628.  CMP #1 ;SINGLE DIMENSION ?
  629.  BEQ FOUND5 ;YES - GO ON
  630.  JMP FINISH ;NO - RETURN
  631. FOUND5 JSR ARRINC ;HI OF ARRAY SIZE
  632.  JSR ARRINC ;LO OF ARRAY SIZE
  633.  LDA (ARRPTR),Y ;GET IT
  634.  STA COUNT ;SAVE IT
  635. GT3 JSR ARRINC ;ONTO ARRAY ELEMENT
  636.  LDA (ARRPTR),Y ;GET LENGTH OF IT
  637.  BNE NOTNUL ;NOT NULL STRING - GO ON
  638.  JMP FINISH ;NUL STRING - STOP
  639. NOTNUL TAX ;SAVE IT
  640.  JSR ARRINC ;MOVE ON ONE
  641.  LDA (ARRPTR),Y ;GET LO
  642.  STA STRPTR ;SET STRPTR LO
  643.  JSR ARRINC ;MOVE ON ONE
  644.  LDA (ARRPTR),Y ;GET HI
  645.  STA STRPTR+1 ;SET STRPTR HI
  646.  LDA STRPTR
  647.  SEC
  648.  SBC #1
  649.  STA STRPTR
  650.  LDA STRPTR+1
  651.  SBC #0
  652.  STA STRPTR+1
  653.  JSR SCANFD ;FIND FIELD ON SCREEN
  654.  BCC FILL ;FOUND ONE - GO ON
  655.  JMP FINISH ;NOT FOUND - RETURN
  656. ;
  657. FILL TXA ;GET LENGTH
  658.  TAY ;SET OFFSET
  659. FILL1 LDA (POINTR),Y
  660. CONV1 PHA ;SAVE BIT 6
  661.  ASL A
  662.  ASL A
  663.  PLA
  664.  PHP
  665.  AND #$3F
  666.  CMP #$20
  667.  BCS CONV2
  668.  ORA #$40
  669. CONV2 PLP
  670.  BCC CONV3
  671.  ORA #$80
  672. CONV3 CMP #',
  673.  BEQ FIXIT
  674.  CMP #'"
  675.  BEQ FIXIT
  676.  CMP #':
  677.  BNE DONE
  678. FIXIT ORA #64
  679. DONE STA (STRPTR),Y
  680.  DEY
  681.  BNE FILL1
  682.  DEC COUNT ;MORE STRINGS ?
  683.  BNE MOREFD ;YES - GO ON
  684.  JMP FINISH ;NO - RETURN
  685. MOREFD JSR FDCRSR ;BUMP CRSR & POINTER
  686.  JMP GT3
  687. ;
  688. ACCMSG .BYT RVS,'PRESS SHIFT RETURN TO'
  689.  .BYT ' ACCEPT SCREEN.',OFFRVS,0
  690. ;
  691. ERSMSG .BYT RVS,'                     '
  692.  .BYT '               ',OFFRVS,0
  693. ;
  694. NOGOOD .BYT RVS,OFFRVS,ESC
  695. ; -------------  PROTECT FROM NASTIES ! --------------
  696.  .BYT 25,153,14,142,131,7,21,149,22,150,15,143
  697. ; ----------------------------------------------------
  698.  .BYT SHFESC,TAB,SHFTAB
  699.  .BYT OPENDL,CLSEDL,0
  700. ;
  701. .END
  702.